// 浅拷贝：只是拷贝了源对象的地址，所以源对象的任何值发生改变时，拷贝对象的值也会随之而发生变化。
// 深拷贝：则是拷贝了源对象的所有值而不是地址，所以即使源对象的值发生任何变化时，拷贝对象的值也不会改变。
/**
 * 1.扩展运算符
let obj = {
  name:"ooo",
  age :[1,2,3]
}
let newObj = {...obj}
obj.age = 90
console.log(obj,newObj);
2.JSON.parse(JSON.stringfy(obj)) 无法拷贝引用类型中的函数
如果obj里有RegExp、Error对象，则序列化的结果将只得到空对象；如果obj里有函数，undefined，则序列化的结果会把函数或 undefined丢失
3.Object.assign（）基本数据类型深拷贝  引用数据类型浅拷贝
 *  */
var p = {
  id: '007',
  name: '刘德华',
  wife: {
    id: '008',
    name: '刘德的妻子',
    address: {
      city: '北京',
      area: '海淀区',
      fn:()=>{}
    },
    ary: [1, 2, 3,{b:1}]
  },
  arr: [1, 2, 3,{a:1}]
};
//写函数
// function copyObj(obj) {
// 	const newObj = Object.prototype.toString.call(obj) === "[object Array]" ? [] : {}
//   for (let key in obj) {
//     if (Object.prototype.toString.call(obj[key]) == '[object Object]' || Object.prototype.toString.call(obj[key]) == '[object Array]') {
//       //如:value是对象,引用类型,那就递归
//       newObj[key] = copyObj(obj[key]);
//     } else {
//       //基本类型,直接赋值
//       newObj[key] = obj[key];
//     }
//   }
// 	return newObj
// }
// const deepCopy = (obj) =>{
// 	//1.判断拷贝的对象是数组还是对象
// 	const newObj = Object.prototype.toString.call(obj) === "[object Array]" ? [] : {}
// 	//2.遍历属性
// 	for(let key in obj){
// 			if(obj.hasOwnProperty(key)){
// 					//是否还有数组或对象
// 					if(obj[key] && typeof obj[key] === 'object'){
// 							//递归
// 							newObj[key] = deepCopy(obj[key])
// 					}else{
// 							//基本数据类型
// 							newObj[key] = obj[key];
// 					}
// 			}
// 	}
// 	return newObj;
// }
// let deepObj = copyObj(p)
// deepObj.arr[3].a=999
// // console.log(deepObj);
// console.log(deepObj);



const  deepClone = function (item) {
    let cloneItem = Object.toString.call(item) == "[object Object]" ? {} : [] 
    for (const key in item) {
      if (Object.prototype.toString.call(obj[key]) == '[object Object]' || Object.prototype.toString.call(obj[key]) == '[object Array]') {
        cloneItem[key] = deepClone(item[key])
      }else{
        cloneItem[key] = item[key]
      }
    }
    return cloneItem
}
